import { ethers } from 'ethers'

// 配置
const providerUrl: string =
  'https://sly-snowy-resonance.bsc.quiknode.pro/df130e3b4a962f23bc90ff2233d5fcb03315655e' // BSC 主网 RPC 节点
// const providerUrl: string = 'https://bsc-dataseed.binance.org/' // BSC 主网 RPC 节点
const contractAddress: string = '0x91F4A0726c8501c806bDcC349f9b8f9f633Ca102' // 部署后的合约地址，正式最新
// const contractAddress: string = '0xbD90F631bC637844e44D0a84B06cD3eE3C4D9F9B' // 部署后的合约地址，测试最新
// const contractAddress: string = '0xf935A872d3c3209CB7ABeC2Fb46C322f0f496d18' // 部署后的合约地址
// const contractAddress: string = '0x3AC30dEA58C5D909FD7E544920aB769e714805C0' // 部署后的合约地址
// const contractAddress: string = '0x26134b051a8641deecdd37611e43390fe1f5e81f' // 部署后的合约地址

// 从 JSON 文件导入 ABI
import abi from './abi.json' assert { type: 'json' }

// 初始化 provider
const provider: ethers.providers.JsonRpcProvider = new ethers.providers.JsonRpcProvider(providerUrl)

// 连接到合约
const contract: ethers.Contract = new ethers.Contract(contractAddress, abi, provider)

// BSC 主网配置
const BSC_MAINNET_CONFIG = {
  chainId: '0x38', // BSC 主网的链 ID（56 的十六进制）
  chainName: 'Binance Smart Chain Mainnet',
  nativeCurrency: {
    name: 'BNB',
    symbol: 'BNB',
    decimals: 18
  },
  rpcUrls: [providerUrl],
  blockExplorerUrls: ['https://bscscan.com/']
}

export const checkWallet = async (pre: string) => {
  if (!window.ethereum) {
    console.log('请安装MetaMask或其他Ethereum钱包扩展。')
    return false
  }
  const address = (await window.ethereum.request({ method: 'eth_requestAccounts' })) + ''
  const compare = address.toLowerCase() == pre.toLowerCase()
  console.log(`cur: ${address}  pre: ${pre} ${compare}`)
  try {
    if (compare) {
      console.log(`${address} checked.`)
      return true
    }
    console.log(`${address} checking...`)
    return false
  } catch (error) {
    console.log(`${address} check fail.`)
    console.log('error:', error)
    return false
  }
}

// 链接钱包并切换网络
export async function connectWallet(): Promise<ethers.providers.JsonRpcSigner> {
  // 检查是否安装了 MetaMask 或其他 Web3 钱包
  if (!window.ethereum) {
    throw new Error('请安装 MetaMask 或其他 Web3 钱包')
  }

  // 请求用户授权连接钱包
  await window.ethereum.request({ method: 'eth_requestAccounts' })

  // 检查当前网络是否为 BSC 主网
  const chainId = await window.ethereum.request({ method: 'eth_chainId' })
  if (chainId !== BSC_MAINNET_CONFIG.chainId) {
    try {
      // 尝试切换到 BSC 主网
      await window.ethereum.request({
        method: 'wallet_switchEthereumChain',
        params: [{ chainId: BSC_MAINNET_CONFIG.chainId }]
      })
    } catch (error) {
      // 如果网络未添加，提示用户添加 BSC 主网
      if (error.code === 4902) {
        await window.ethereum.request({
          method: 'wallet_addEthereumChain',
          params: [BSC_MAINNET_CONFIG]
        })
      } else {
        throw new Error('切换网络失败，请手动切换到 BSC 主网')
      }
    }
  }

  // 创建 signer
  const web3Provider = new ethers.providers.Web3Provider(window.ethereum)
  const signer: ethers.providers.JsonRpcSigner = web3Provider.getSigner()

  console.log('钱包已连接，地址:', await signer.getAddress())
  return signer
}

// 查询当前钱包余额
export async function getWalletBalance(signer: ethers.providers.JsonRpcSigner): Promise<string> {
  const address = await signer.getAddress()
  const balance = await provider.getBalance(address)
  return ethers.utils.formatEther(balance) // 将余额从 Wei 转换为 BNB
}

// 调用 transferBNB 函数
export async function callTransferBNB(directRewardWallet: string, num: string): Promise<boolean> {
  try {
    // 链接钱包
    const signer = await connectWallet()

    // 查询钱包余额
    const balance = await getWalletBalance(signer)
    console.log('当前钱包余额:', balance, 'BNB')

    // 连接到合约并使用 signer
    const contractWithSigner = contract.connect(signer)

    // 设置转账金额（1 BNB）
    const amount: ethers.BigNumber = ethers.utils.parseEther(num) // 1 BNB

    // 调用 transferBNB 函数
    const tx: ethers.ContractTransaction = await contractWithSigner.transferBNB(
      directRewardWallet,
      {
        value: amount, // 发送的 BNB 数量
        gasLimit: 300000 // 设置 Gas Limit
      }
    )

    console.log('交易已发送，等待确认...')
    console.log('交易哈希:', tx.hash)

    // 等待交易确认
    const receipt: ethers.ContractReceipt = await tx.wait()
    console.log('交易已确认，区块号:', receipt.blockNumber)
    return true
  } catch (error) {
    console.error('调用 transferBNB 失败:', error)
    return false
  }
}
